<?php
	/**
	 * Extrai o arquivo zipado na pasta indicada
	 *
	 * @param   string      O caminho do arquivo.
	 * @param   string      O caminho no qual o arquivo sera extraido, se falso o arquivo sera extraido no mesmo dir.
	 * @param   boolean     extrair em uma pasta com o nome do arquivo.
	 * @param   boolean     Substituir arquivos existentes
	 *  
	 * @return  boolean     Sucesso ou falha
	 */
	function unzip($src_file, $dest_dir=false, $create_zip_name_dir=true, $overwrite=true){
		if(!checaFile($src_file)){
			echo "O arquivo é invalido";
			return false;
		}
  		if ($zip = zip_open($src_file)){
    		if ($zip){
      			$splitter = ($create_zip_name_dir === true) ? "." : "/";
      			if ($dest_dir === false) $dest_dir = substr($src_file, 0, strrpos($src_file, $splitter))."/";
      			// Cria os diretorios caso eles ainda nao existam
      			create_dirs($dest_dir);
				// Para cada um dos arquivos do zip
      			while ($zip_entry = zip_read($zip)){
					// Se o arquivo nao esta no diretorio raiz
					$pos_last_slash = strrpos(zip_entry_name($zip_entry), "/");
					if ($pos_last_slash !== false){
						// Cria os diretorios
						create_dirs($dest_dir.substr(zip_entry_name($zip_entry), 0, $pos_last_slash+1));
					}
					// Abre o arquivo
					if (zip_entry_open($zip,$zip_entry,"r")){
						// O nome do arquivo a ser salvo no disco
						$file_name = $dest_dir.zip_entry_name($zip_entry);
						// Checa se o arquivo vai ser sobescrito nou nao
						if ($overwrite === true || $overwrite === false && !is_file($file_name)){
							// Pego o conteudo do arquivo
							$fstream = zip_entry_read($zip_entry, zip_entry_filesize($zip_entry));
							file_put_contents($file_name, $fstream );
							// Atribui os privilegios de acesso.
							chmod($file_name, 0777);
						}
						// Fecha o arquivo
						zip_entry_close($zip_entry);
					}       
      			}
      			// Fecha o zip.
     			 zip_close($zip);
				 //Deleta o arquvo Zipado
	  			unlink($src_file);
	  			
    		}
  		}else{
    		return false;
  		}
		return true;
	}

	/**
	 * Cria os diretorios do zip caso estes nao existam
	 *
	 * @param String  O caminho do diretorio a ser criado.
	 *  
	 * @return  void
	 */
	function create_dirs($path){
  		if (!is_dir($path)){
    		$directory_path = "";
    		$directories = explode("/",$path);
    		array_pop($directories);
			foreach($directories as $directory){
      			$directory_path .= $directory."/";
      			if (!is_dir($directory_path)){
        			mkdir($directory_path);
        			chmod($directory_path, 0777);
      			}
    		}
  		}
	}
	function checaFile($src_file){
		if ($zip = zip_open($src_file)){
			$valido = 0;
			while ($zip_entry = zip_read($zip)){
					$file_name = basename(zip_entry_name($zip_entry));
					if($file_name == 'PersistModelAbstract.php' || $file_name == 'config.ini'){
						$valido++; 
					}
					zip_entry_close($zip_entry);
			}
			return ($valido == 2) ? true : false;
			zip_close($zip);
  		}
	}
?>